package com.wuseguang.springcloud.mina;

import com.alibaba.fastjson.JSONObject;
import com.wuseguang.springcloud.mina.changYing.*;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;

public class ByteModleEncoder extends ProtocolEncoderAdapter {
    @Override
    public void encode(IoSession ioSession, Object o, ProtocolEncoderOutput out) throws Exception {

        AiSendMsgDataModle modle = (AiSendMsgDataModle)o;

        try{

            //包头
            byte[] head = ByteArrayUtilsBe.getBytes(AiCameraToCloudConstants.HEAD);
            //协议版本
            byte[] version = ByteArrayUtilsBe.getBytes1(AiCameraToCloudConstants.VERSION);
            //长度
            byte[] length = new byte[0];
            //指令 //2
            byte[] order = new byte[0];
            //randId
            byte[] randId = new byte[0];
            //data //4
            byte[] data = new byte[0];
            //校验 //2
            byte[] check;
            //包尾 //1
            byte[] end = ByteArrayUtilsBe.getBytes1(AiCameraToCloudConstants.END);
            if (modle.getType() == 0) {
                //登录包回复
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.LOGINORDER);
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                data = randId;
                length = ByteArrayUtilsBe.getBytes3(13);
            } else if (modle.getType() == 1) {
                //心跳包回复
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.HEARTORDER);
                char c = 0x40;
                data = ByteArrayUtilsBe.getBytes1(c);
                length = ByteArrayUtilsBe.getBytes3(6);
            } else if (modle.getType() == 2) {
                //json类型数据回复
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.JSONORDER);
                //这里特殊处理一下,
                String sendMsg = modle.getSendMsg();
                JSONObject jsonObject = JSONObject.parseObject(sendMsg);
                if (FaceServiceName.AI_ADDUSER.equals(jsonObject.getString("service_name"))) {
                    //编码做特殊处理
                    data = sendMsg.getBytes("UTF-8");
                } else {
                    data = sendMsg.getBytes("GB2312");
                }
                length = ByteArrayUtilsBe.getBytes3(9 + data.length);
            } else if (modle.getType() == 3) {
                //二进制数据类型，平台传文件到相机
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.FILEORDER);
                //获取文件路径
                String filePath = modle.getSendMsg();
                byte[] pathByte = filePath.getBytes("GB2312");
                //获取文件名长度
                int nameLen = pathByte.length;
                byte[] nameLenByte = ByteArrayUtilsBe.getBytes1(nameLen);
                //获取需要下发文件
                byte[] file = modle.getSendByte();
                //文件的长度
                byte[] fileLen = ByteArrayUtilsBe.getBytes4(file.length);
                //组合data
                data = ByteArrayUtilsBe.unitByteArray(nameLenByte, fileLen, pathByte, file);
                length = ByteArrayUtilsBe.getBytes3(9 + data.length);
            } else if (modle.getType() == 4) {
                //二进制数据类型，下发获取相机文件
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.GETFILEORDER);
                //获取文件路径
                String filePath = modle.getSendMsg();
                byte[] pathByte = filePath.getBytes("GB2312");
                //获取文件名长度
                int len = pathByte.length;
                byte[] lenByte = ByteArrayUtilsBe.getBytes1(len);
                //固定标记
                byte[] sign = modle.getSign().getBytes("GB2312");
                //组合data
                data = ByteArrayUtilsBe.unitByteArray(lenByte, sign, pathByte);
                length = ByteArrayUtilsBe.getBytes3(9 + data.length);
            } else if (modle.getType() == 5) {
                //二进制数据类型，下发获取相机文件(大文件传输方案)
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.GETBIGFILEORDER);
                data = modle.getSendByte();
                length = ByteArrayUtilsBe.getBytes3(9 + data.length);
            } else if (modle.getType() == 6) {
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.SETPARAMETER);
                data = modle.getSendByte();
                length = ByteArrayUtilsBe.getBytes3(9 + data.length);
            } else if (modle.getType() == 7) {
                randId = ByteArrayUtilsBe.getBytes4(modle.getRandId());
                order = ByteArrayUtilsBe.getBytes2(AiCloudToCameraConstants.GETPARAMETER);
                data = modle.getSendByte();
                length = ByteArrayUtilsBe.getBytes3(9 + data.length);
            }
            byte[] checkByte = ByteArrayUtilsBe.unitByteArray(length, order, randId, data);
            check = CheckSumUtil.getCheckByte(checkByte);
            //全部组合在一起
            byte[] sendByte = ByteArrayUtilsBe.unitByteArray(head, version, checkByte, check, end);
            out.write(IoBuffer.wrap(sendByte));
            out.flush();
        }catch (Exception e){
            out.write(IoBuffer.wrap("".getBytes()));
            out.flush();
        }

    }
}
